00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 #ifndef _AESOPT_H
00136 #define _AESOPT_H
00137
00138 #if defined(__cplusplus)
00139 extern "C"
00140 {
00141 #endif
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 #define NO_TABLES 0
00157 #define ONE_TABLE 1
00158 #define FOUR_TABLES 4
00159 #define NONE 0
00160 #define PARTIAL 1
00161 #define FULL 2
00162 #define AES_LITTLE_ENDIAN 1234
00163 #define AES_BIG_ENDIAN 4321
00164
00165
00166
00167 #if defined( __CRYPTLIB__ ) && !defined( INC_ALL ) && !defined( INC_CHILD )
00168 #include "crypt/aes.h"
00169 #else
00170 #include "aes.h"
00171 #endif
00172
00173 #if defined(__GNUC__) || defined(__GNU_LIBRARY__)
00174 # if defined( __FreeBSD__ ) || defined( __OpenBSD__ )
00175 # include <sys/endian.h>
00176 # elif defined( __APPLE__ )
00177 # if defined( __BIG_ENDIAN__ ) && !defined( BIG_ENDIAN )
00178 # define BIG_ENDIAN
00179 # elif defined( __LITTLE_ENDIAN__ ) && !defined( LITTLE_ENDIAN )
00180 # define LITTLE_ENDIAN
00181 # else
00182 # error Need to define CPU endianness for OS X
00183 # endif
00184 # elif defined(_WIN32)
00185 # include <stdlib.h>
00186 # else
00187 # include <endian.h>
00188 # include <byteswap.h>
00189 # endif
00190 #elif defined(__CRYPTLIB__)
00191 # if defined( INC_ALL )
00192 # include "crypt.h"
00193 # elif defined( INC_CHILD )
00194 # include "../crypt.h"
00195 # else
00196 # include "crypt.h"
00197 # endif
00198 # if defined(DATA_LITTLEENDIAN)
00199 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00200 # else
00201 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00202 # endif
00203 #elif defined(_MSC_VER)
00204 # include <stdlib.h>
00205 #elif !defined(WIN32)
00206 # include <stdlib.h>
00207 # if !defined (_ENDIAN_H)
00208 # include <sys/param.h>
00209 # else
00210 # include _ENDIAN_H
00211 # endif
00212 #endif
00213
00214 #if defined(bswap32)
00215 #define aes_sw32 bswap32
00216 #elif defined(bswap_32)
00217 #define aes_sw32 bswap_32
00218 #endif
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 #if !defined(PLATFORM_BYTE_ORDER)
00230 #if defined(LITTLE_ENDIAN) || defined(BIG_ENDIAN)
00231 # if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
00232 # if defined(BYTE_ORDER)
00233 # if (BYTE_ORDER == LITTLE_ENDIAN)
00234 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00235 # elif (BYTE_ORDER == BIG_ENDIAN)
00236 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00237 # endif
00238 # endif
00239 # elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
00240 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00241 # elif !defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
00242 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00243 # endif
00244 #elif defined(_LITTLE_ENDIAN) || defined(_BIG_ENDIAN)
00245 # if defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
00246 # if defined(_BYTE_ORDER)
00247 # if (_BYTE_ORDER == _LITTLE_ENDIAN)
00248 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00249 # elif (_BYTE_ORDER == _BIG_ENDIAN)
00250 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00251 # endif
00252 # endif
00253 # elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
00254 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00255 # elif !defined(_LITTLE_ENDIAN) && defined(_BIG_ENDIAN)
00256 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00257 # endif
00258 #elif 0
00259 #define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00260 #elif 0
00261 #define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00262 #elif (('1234' >> 24) == '1')
00263 # define PLATFORM_BYTE_ORDER AES_LITTLE_ENDIAN
00264 #elif (('4321' >> 24) == '1')
00265 # define PLATFORM_BYTE_ORDER AES_BIG_ENDIAN
00266 #endif
00267 #endif
00268
00269 #if !defined(PLATFORM_BYTE_ORDER)
00270 # error Please set undetermined byte order (lines 241 or 243 of aesopt.h).
00271 #endif
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 #ifdef AES_ENCRYPT
00282 #define ENCRYPTION
00283 #define ENCRYPTION_KEY_SCHEDULE
00284 #endif
00285
00286 #ifdef AES_DECRYPT
00287 #define DECRYPTION
00288 #define DECRYPTION_KEY_SCHEDULE
00289 #endif
00290
00291
00292
00293
00294
00295
00296
00297 #if 0
00298 #define AES_ASM
00299 #endif
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330 #if 1 || defined(AES_ASM)
00331 #define INTERNAL_BYTE_ORDER PLATFORM_BYTE_ORDER
00332 #elif 0
00333 #define INTERNAL_BYTE_ORDER AES_LITTLE_ENDIAN
00334 #elif 0
00335 #define INTERNAL_BYTE_ORDER AES_BIG_ENDIAN
00336 #else
00337 #error The internal byte order is not defined
00338 #endif
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 #if 1 && !defined(_MSC_VER)
00357 #define SAFE_IO
00358 #endif
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371 #if 1
00372 #define ENC_UNROLL FULL
00373 #elif 0
00374 #define ENC_UNROLL PARTIAL
00375 #else
00376 #define ENC_UNROLL NONE
00377 #endif
00378
00379 #if 1
00380 #define DEC_UNROLL FULL
00381 #elif 0
00382 #define DEC_UNROLL PARTIAL
00383 #else
00384 #define DEC_UNROLL NONE
00385 #endif
00386
00387
00388
00389
00390
00391
00392 #if 1
00393 #define FF_TABLES
00394 #endif
00395
00396
00397
00398
00399
00400
00401
00402
00403 #if 1
00404 #define ARRAYS
00405 #endif
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 #if defined(ARRAYS)
00419 #define s(x,c) x[c]
00420 #else
00421 #define s(x,c) x##c
00422 #endif
00423
00424
00425
00426
00427
00428
00429
00430 #if 1
00431 #define FIXED_TABLES
00432 #endif
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442 #define TABLE_ALIGN 64
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 #if 1
00465 #define ENC_ROUND FOUR_TABLES
00466 #elif 0
00467 #define ENC_ROUND ONE_TABLE
00468 #else
00469 #define ENC_ROUND NO_TABLES
00470 #endif
00471
00472 #if 1
00473 #define LAST_ENC_ROUND FOUR_TABLES
00474 #elif 0
00475 #define LAST_ENC_ROUND ONE_TABLE
00476 #else
00477 #define LAST_ENC_ROUND NO_TABLES
00478 #endif
00479
00480 #if 1
00481 #define DEC_ROUND FOUR_TABLES
00482 #elif 0
00483 #define DEC_ROUND ONE_TABLE
00484 #else
00485 #define DEC_ROUND NO_TABLES
00486 #endif
00487
00488 #if 1
00489 #define LAST_DEC_ROUND FOUR_TABLES
00490 #elif 0
00491 #define LAST_DEC_ROUND ONE_TABLE
00492 #else
00493 #define LAST_DEC_ROUND NO_TABLES
00494 #endif
00495
00496
00497
00498
00499
00500 #if 1
00501 #define KEY_SCHED FOUR_TABLES
00502 #elif 0
00503 #define KEY_SCHED ONE_TABLE
00504 #else
00505 #define KEY_SCHED NO_TABLES
00506 #endif
00507
00508
00509
00510 #define RC_LENGTH (5 * (AES_BLOCK_SIZE / 4 - 2))
00511
00512
00513
00514 #if ENC_ROUND == NO_TABLES && LAST_ENC_ROUND != NO_TABLES
00515 #undef LAST_ENC_ROUND
00516 #define LAST_ENC_ROUND NO_TABLES
00517 #elif ENC_ROUND == ONE_TABLE && LAST_ENC_ROUND == FOUR_TABLES
00518 #undef LAST_ENC_ROUND
00519 #define LAST_ENC_ROUND ONE_TABLE
00520 #endif
00521
00522 #if ENC_ROUND == NO_TABLES && ENC_UNROLL != NONE
00523 #undef ENC_UNROLL
00524 #define ENC_UNROLL NONE
00525 #endif
00526
00527 #if DEC_ROUND == NO_TABLES && LAST_DEC_ROUND != NO_TABLES
00528 #undef LAST_DEC_ROUND
00529 #define LAST_DEC_ROUND NO_TABLES
00530 #elif DEC_ROUND == ONE_TABLE && LAST_DEC_ROUND == FOUR_TABLES
00531 #undef LAST_DEC_ROUND
00532 #define LAST_DEC_ROUND ONE_TABLE
00533 #endif
00534
00535 #if DEC_ROUND == NO_TABLES && DEC_UNROLL != NONE
00536 #undef DEC_UNROLL
00537 #define DEC_UNROLL NONE
00538 #endif
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 #if (INTERNAL_BYTE_ORDER == AES_LITTLE_ENDIAN)
00552 #define upr(x,n) (((aes_32t)(x) << (8 * (n))) | ((aes_32t)(x) >> (32 - 8 * (n))))
00553 #define ups(x,n) ((aes_32t) (x) << (8 * (n)))
00554 #define bval(x,n) ((aes_08t)((x) >> (8 * (n))))
00555 #define bytes2word(b0, b1, b2, b3) \
00556 (((aes_32t)(b3) << 24) | ((aes_32t)(b2) << 16) | ((aes_32t)(b1) << 8) | (b0))
00557 #endif
00558
00559 #if (INTERNAL_BYTE_ORDER == AES_BIG_ENDIAN)
00560 #define upr(x,n) (((aes_32t)(x) >> (8 * (n))) | ((aes_32t)(x) << (32 - 8 * (n))))
00561 #define ups(x,n) ((aes_32t) (x) >> (8 * (n))))
00562 #define bval(x,n) ((aes_08t)((x) >> (24 - 8 * (n))))
00563 #define bytes2word(b0, b1, b2, b3) \
00564 (((aes_32t)(b0) << 24) | ((aes_32t)(b1) << 16) | ((aes_32t)(b2) << 8) | (b3))
00565 #endif
00566
00567 #if defined(SAFE_IO)
00568
00569 #define word_in(x,c) bytes2word(((aes_08t*)(x)+4*c)[0], ((aes_08t*)(x)+4*c)[1], \
00570 ((aes_08t*)(x)+4*c)[2], ((aes_08t*)(x)+4*c)[3])
00571 #define word_out(x,c,v) { ((aes_08t*)(x)+4*c)[0] = bval(v,0); ((aes_08t*)(x)+4*c)[1] = bval(v,1); \
00572 ((aes_08t*)(x)+4*c)[2] = bval(v,2); ((aes_08t*)(x)+4*c)[3] = bval(v,3); }
00573
00574 #elif (INTERNAL_BYTE_ORDER == PLATFORM_BYTE_ORDER)
00575
00576 #define word_in(x,c) (*((aes_32t*)(x)+(c)))
00577 #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = (v))
00578
00579 #else
00580
00581 #ifndef aes_sw32
00582 #define brot(x,n) (((aes_32t)(x) << n) | ((aes_32t)(x) >> (32 - n)))
00583 #define aes_sw32(x) ((brot((x),8) & 0x00ff00ff) | (brot((x),24) & 0xff00ff00))
00584 #endif
00585
00586 #define word_in(x,c) aes_sw32(*((aes_32t*)(x)+(c)))
00587 #define word_out(x,c,v) (*((aes_32t*)(x)+(c)) = aes_sw32(v))
00588
00589 #endif
00590
00591
00592
00593 #define WPOLY 0x011b
00594 #define BPOLY 0x1b
00595
00596
00597
00598 #define m1 0x80808080
00599 #define m2 0x7f7f7f7f
00600 #define gf_mulx(x) ((((x) & m2) << 1) ^ ((((x) & m1) >> 7) * BPOLY))
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 #ifdef AES_ASM
00614 #ifdef ENC_ROUND
00615 #undef ENC_ROUND
00616 #endif
00617 #define ENC_ROUND FOUR_TABLES
00618 #ifdef LAST_ENC_ROUND
00619 #undef LAST_ENC_ROUND
00620 #endif
00621 #define LAST_ENC_ROUND FOUR_TABLES
00622 #ifdef DEC_ROUND
00623 #undef DEC_ROUND
00624 #endif
00625 #define DEC_ROUND FOUR_TABLES
00626 #ifdef LAST_DEC_ROUND
00627 #undef LAST_DEC_ROUND
00628 #endif
00629 #define LAST_DEC_ROUND FOUR_TABLES
00630 #ifdef KEY_SCHED
00631 #undef KEY_SCHED
00632 #define KEY_SCHED FOUR_TABLES
00633 #endif
00634 #endif
00635
00636 #if defined(ENCRYPTION) || defined(AES_ASM)
00637 #if ENC_ROUND == ONE_TABLE
00638 #define FT1_SET
00639 #elif ENC_ROUND == FOUR_TABLES
00640 #define FT4_SET
00641 #else
00642 #define SBX_SET
00643 #endif
00644 #if LAST_ENC_ROUND == ONE_TABLE
00645 #define FL1_SET
00646 #elif LAST_ENC_ROUND == FOUR_TABLES
00647 #define FL4_SET
00648 #elif !defined(SBX_SET)
00649 #define SBX_SET
00650 #endif
00651 #endif
00652
00653 #if defined(DECRYPTION) || defined(AES_ASM)
00654 #if DEC_ROUND == ONE_TABLE
00655 #define IT1_SET
00656 #elif DEC_ROUND == FOUR_TABLES
00657 #define IT4_SET
00658 #else
00659 #define ISB_SET
00660 #endif
00661 #if LAST_DEC_ROUND == ONE_TABLE
00662 #define IL1_SET
00663 #elif LAST_DEC_ROUND == FOUR_TABLES
00664 #define IL4_SET
00665 #elif !defined(ISB_SET)
00666 #define ISB_SET
00667 #endif
00668 #endif
00669
00670 #if defined(ENCRYPTION_KEY_SCHEDULE) || defined(DECRYPTION_KEY_SCHEDULE)
00671 #if KEY_SCHED == ONE_TABLE
00672 #define LS1_SET
00673 #define IM1_SET
00674 #elif KEY_SCHED == FOUR_TABLES
00675 #define LS4_SET
00676 #define IM4_SET
00677 #elif !defined(SBX_SET)
00678 #define SBX_SET
00679 #endif
00680 #endif
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721 #define t_dec(m,n) t_##m##n
00722 #define t_set(m,n) t_##m##n
00723 #define t_use(m,n) t_##m##n
00724
00725 #if defined(DO_TABLES)
00726
00727
00728
00729 #if defined(FIXED_TABLES) || !defined(FF_TABLES)
00730
00731 #define f2(x) ((x<<1) ^ (((x>>7) & 1) * WPOLY))
00732 #define f4(x) ((x<<2) ^ (((x>>6) & 1) * WPOLY) ^ (((x>>6) & 2) * WPOLY))
00733 #define f8(x) ((x<<3) ^ (((x>>5) & 1) * WPOLY) ^ (((x>>5) & 2) * WPOLY) \
00734 ^ (((x>>5) & 4) * WPOLY))
00735 #define f3(x) (f2(x) ^ x)
00736 #define f9(x) (f8(x) ^ x)
00737 #define fb(x) (f8(x) ^ f2(x) ^ x)
00738 #define fd(x) (f8(x) ^ f4(x) ^ x)
00739 #define fe(x) (f8(x) ^ f4(x) ^ f2(x))
00740
00741 #else
00742
00743 #define f2(x) ((x) ? pow[log[x] + 0x19] : 0)
00744 #define f3(x) ((x) ? pow[log[x] + 0x01] : 0)
00745 #define f9(x) ((x) ? pow[log[x] + 0xc7] : 0)
00746 #define fb(x) ((x) ? pow[log[x] + 0x68] : 0)
00747 #define fd(x) ((x) ? pow[log[x] + 0xee] : 0)
00748 #define fe(x) ((x) ? pow[log[x] + 0xdf] : 0)
00749 #define fi(x) ((x) ? pow[ 255 - log[x]] : 0)
00750
00751 #endif
00752
00753 #if defined(FIXED_TABLES)
00754
00755 #define sb_data(w) \
00756 w(0x63), w(0x7c), w(0x77), w(0x7b), w(0xf2), w(0x6b), w(0x6f), w(0xc5),\
00757 w(0x30), w(0x01), w(0x67), w(0x2b), w(0xfe), w(0xd7), w(0xab), w(0x76),\
00758 w(0xca), w(0x82), w(0xc9), w(0x7d), w(0xfa), w(0x59), w(0x47), w(0xf0),\
00759 w(0xad), w(0xd4), w(0xa2), w(0xaf), w(0x9c), w(0xa4), w(0x72), w(0xc0),\
00760 w(0xb7), w(0xfd), w(0x93), w(0x26), w(0x36), w(0x3f), w(0xf7), w(0xcc),\
00761 w(0x34), w(0xa5), w(0xe5), w(0xf1), w(0x71), w(0xd8), w(0x31), w(0x15),\
00762 w(0x04), w(0xc7), w(0x23), w(0xc3), w(0x18), w(0x96), w(0x05), w(0x9a),\
00763 w(0x07), w(0x12), w(0x80), w(0xe2), w(0xeb), w(0x27), w(0xb2), w(0x75),\
00764 w(0x09), w(0x83), w(0x2c), w(0x1a), w(0x1b), w(0x6e), w(0x5a), w(0xa0),\
00765 w(0x52), w(0x3b), w(0xd6), w(0xb3), w(0x29), w(0xe3), w(0x2f), w(0x84),\
00766 w(0x53), w(0xd1), w(0x00), w(0xed), w(0x20), w(0xfc), w(0xb1), w(0x5b),\
00767 w(0x6a), w(0xcb), w(0xbe), w(0x39), w(0x4a), w(0x4c), w(0x58), w(0xcf),\
00768 w(0xd0), w(0xef), w(0xaa), w(0xfb), w(0x43), w(0x4d), w(0x33), w(0x85),\
00769 w(0x45), w(0xf9), w(0x02), w(0x7f), w(0x50), w(0x3c), w(0x9f), w(0xa8),\
00770 w(0x51), w(0xa3), w(0x40), w(0x8f), w(0x92), w(0x9d), w(0x38), w(0xf5),\
00771 w(0xbc), w(0xb6), w(0xda), w(0x21), w(0x10), w(0xff), w(0xf3), w(0xd2),\
00772 w(0xcd), w(0x0c), w(0x13), w(0xec), w(0x5f), w(0x97), w(0x44), w(0x17),\
00773 w(0xc4), w(0xa7), w(0x7e), w(0x3d), w(0x64), w(0x5d), w(0x19), w(0x73),\
00774 w(0x60), w(0x81), w(0x4f), w(0xdc), w(0x22), w(0x2a), w(0x90), w(0x88),\
00775 w(0x46), w(0xee), w(0xb8), w(0x14), w(0xde), w(0x5e), w(0x0b), w(0xdb),\
00776 w(0xe0), w(0x32), w(0x3a), w(0x0a), w(0x49), w(0x06), w(0x24), w(0x5c),\
00777 w(0xc2), w(0xd3), w(0xac), w(0x62), w(0x91), w(0x95), w(0xe4), w(0x79),\
00778 w(0xe7), w(0xc8), w(0x37), w(0x6d), w(0x8d), w(0xd5), w(0x4e), w(0xa9),\
00779 w(0x6c), w(0x56), w(0xf4), w(0xea), w(0x65), w(0x7a), w(0xae), w(0x08),\
00780 w(0xba), w(0x78), w(0x25), w(0x2e), w(0x1c), w(0xa6), w(0xb4), w(0xc6),\
00781 w(0xe8), w(0xdd), w(0x74), w(0x1f), w(0x4b), w(0xbd), w(0x8b), w(0x8a),\
00782 w(0x70), w(0x3e), w(0xb5), w(0x66), w(0x48), w(0x03), w(0xf6), w(0x0e),\
00783 w(0x61), w(0x35), w(0x57), w(0xb9), w(0x86), w(0xc1), w(0x1d), w(0x9e),\
00784 w(0xe1), w(0xf8), w(0x98), w(0x11), w(0x69), w(0xd9), w(0x8e), w(0x94),\
00785 w(0x9b), w(0x1e), w(0x87), w(0xe9), w(0xce), w(0x55), w(0x28), w(0xdf),\
00786 w(0x8c), w(0xa1), w(0x89), w(0x0d), w(0xbf), w(0xe6), w(0x42), w(0x68),\
00787 w(0x41), w(0x99), w(0x2d), w(0x0f), w(0xb0), w(0x54), w(0xbb), w(0x16)
00788
00789 #define isb_data(w) \
00790 w(0x52), w(0x09), w(0x6a), w(0xd5), w(0x30), w(0x36), w(0xa5), w(0x38),\
00791 w(0xbf), w(0x40), w(0xa3), w(0x9e), w(0x81), w(0xf3), w(0xd7), w(0xfb),\
00792 w(0x7c), w(0xe3), w(0x39), w(0x82), w(0x9b), w(0x2f), w(0xff), w(0x87),\
00793 w(0x34), w(0x8e), w(0x43), w(0x44), w(0xc4), w(0xde), w(0xe9), w(0xcb),\
00794 w(0x54), w(0x7b), w(0x94), w(0x32), w(0xa6), w(0xc2), w(0x23), w(0x3d),\
00795 w(0xee), w(0x4c), w(0x95), w(0x0b), w(0x42), w(0xfa), w(0xc3), w(0x4e),\
00796 w(0x08), w(0x2e), w(0xa1), w(0x66), w(0x28), w(0xd9), w(0x24), w(0xb2),\
00797 w(0x76), w(0x5b), w(0xa2), w(0x49), w(0x6d), w(0x8b), w(0xd1), w(0x25),\
00798 w(0x72), w(0xf8), w(0xf6), w(0x64), w(0x86), w(0x68), w(0x98), w(0x16),\
00799 w(0xd4), w(0xa4), w(0x5c), w(0xcc), w(0x5d), w(0x65), w(0xb6), w(0x92),\
00800 w(0x6c), w(0x70), w(0x48), w(0x50), w(0xfd), w(0xed), w(0xb9), w(0xda),\
00801 w(0x5e), w(0x15), w(0x46), w(0x57), w(0xa7), w(0x8d), w(0x9d), w(0x84),\
00802 w(0x90), w(0xd8), w(0xab), w(0x00), w(0x8c), w(0xbc), w(0xd3), w(0x0a),\
00803 w(0xf7), w(0xe4), w(0x58), w(0x05), w(0xb8), w(0xb3), w(0x45), w(0x06),\
00804 w(0xd0), w(0x2c), w(0x1e), w(0x8f), w(0xca), w(0x3f), w(0x0f), w(0x02),\
00805 w(0xc1), w(0xaf), w(0xbd), w(0x03), w(0x01), w(0x13), w(0x8a), w(0x6b),\
00806 w(0x3a), w(0x91), w(0x11), w(0x41), w(0x4f), w(0x67), w(0xdc), w(0xea),\
00807 w(0x97), w(0xf2), w(0xcf), w(0xce), w(0xf0), w(0xb4), w(0xe6), w(0x73),\
00808 w(0x96), w(0xac), w(0x74), w(0x22), w(0xe7), w(0xad), w(0x35), w(0x85),\
00809 w(0xe2), w(0xf9), w(0x37), w(0xe8), w(0x1c), w(0x75), w(0xdf), w(0x6e),\
00810 w(0x47), w(0xf1), w(0x1a), w(0x71), w(0x1d), w(0x29), w(0xc5), w(0x89),\
00811 w(0x6f), w(0xb7), w(0x62), w(0x0e), w(0xaa), w(0x18), w(0xbe), w(0x1b),\
00812 w(0xfc), w(0x56), w(0x3e), w(0x4b), w(0xc6), w(0xd2), w(0x79), w(0x20),\
00813 w(0x9a), w(0xdb), w(0xc0), w(0xfe), w(0x78), w(0xcd), w(0x5a), w(0xf4),\
00814 w(0x1f), w(0xdd), w(0xa8), w(0x33), w(0x88), w(0x07), w(0xc7), w(0x31),\
00815 w(0xb1), w(0x12), w(0x10), w(0x59), w(0x27), w(0x80), w(0xec), w(0x5f),\
00816 w(0x60), w(0x51), w(0x7f), w(0xa9), w(0x19), w(0xb5), w(0x4a), w(0x0d),\
00817 w(0x2d), w(0xe5), w(0x7a), w(0x9f), w(0x93), w(0xc9), w(0x9c), w(0xef),\
00818 w(0xa0), w(0xe0), w(0x3b), w(0x4d), w(0xae), w(0x2a), w(0xf5), w(0xb0),\
00819 w(0xc8), w(0xeb), w(0xbb), w(0x3c), w(0x83), w(0x53), w(0x99), w(0x61),\
00820 w(0x17), w(0x2b), w(0x04), w(0x7e), w(0xba), w(0x77), w(0xd6), w(0x26),\
00821 w(0xe1), w(0x69), w(0x14), w(0x63), w(0x55), w(0x21), w(0x0c), w(0x7d),
00822
00823 #define mm_data(w) \
00824 w(0x00), w(0x01), w(0x02), w(0x03), w(0x04), w(0x05), w(0x06), w(0x07),\
00825 w(0x08), w(0x09), w(0x0a), w(0x0b), w(0x0c), w(0x0d), w(0x0e), w(0x0f),\
00826 w(0x10), w(0x11), w(0x12), w(0x13), w(0x14), w(0x15), w(0x16), w(0x17),\
00827 w(0x18), w(0x19), w(0x1a), w(0x1b), w(0x1c), w(0x1d), w(0x1e), w(0x1f),\
00828 w(0x20), w(0x21), w(0x22), w(0x23), w(0x24), w(0x25), w(0x26), w(0x27),\
00829 w(0x28), w(0x29), w(0x2a), w(0x2b), w(0x2c), w(0x2d), w(0x2e), w(0x2f),\
00830 w(0x30), w(0x31), w(0x32), w(0x33), w(0x34), w(0x35), w(0x36), w(0x37),\
00831 w(0x38), w(0x39), w(0x3a), w(0x3b), w(0x3c), w(0x3d), w(0x3e), w(0x3f),\
00832 w(0x40), w(0x41), w(0x42), w(0x43), w(0x44), w(0x45), w(0x46), w(0x47),\
00833 w(0x48), w(0x49), w(0x4a), w(0x4b), w(0x4c), w(0x4d), w(0x4e), w(0x4f),\
00834 w(0x50), w(0x51), w(0x52), w(0x53), w(0x54), w(0x55), w(0x56), w(0x57),\
00835 w(0x58), w(0x59), w(0x5a), w(0x5b), w(0x5c), w(0x5d), w(0x5e), w(0x5f),\
00836 w(0x60), w(0x61), w(0x62), w(0x63), w(0x64), w(0x65), w(0x66), w(0x67),\
00837 w(0x68), w(0x69), w(0x6a), w(0x6b), w(0x6c), w(0x6d), w(0x6e), w(0x6f),\
00838 w(0x70), w(0x71), w(0x72), w(0x73), w(0x74), w(0x75), w(0x76), w(0x77),\
00839 w(0x78), w(0x79), w(0x7a), w(0x7b), w(0x7c), w(0x7d), w(0x7e), w(0x7f),\
00840 w(0x80), w(0x81), w(0x82), w(0x83), w(0x84), w(0x85), w(0x86), w(0x87),\
00841 w(0x88), w(0x89), w(0x8a), w(0x8b), w(0x8c), w(0x8d), w(0x8e), w(0x8f),\
00842 w(0x90), w(0x91), w(0x92), w(0x93), w(0x94), w(0x95), w(0x96), w(0x97),\
00843 w(0x98), w(0x99), w(0x9a), w(0x9b), w(0x9c), w(0x9d), w(0x9e), w(0x9f),\
00844 w(0xa0), w(0xa1), w(0xa2), w(0xa3), w(0xa4), w(0xa5), w(0xa6), w(0xa7),\
00845 w(0xa8), w(0xa9), w(0xaa), w(0xab), w(0xac), w(0xad), w(0xae), w(0xaf),\
00846 w(0xb0), w(0xb1), w(0xb2), w(0xb3), w(0xb4), w(0xb5), w(0xb6), w(0xb7),\
00847 w(0xb8), w(0xb9), w(0xba), w(0xbb), w(0xbc), w(0xbd), w(0xbe), w(0xbf),\
00848 w(0xc0), w(0xc1), w(0xc2), w(0xc3), w(0xc4), w(0xc5), w(0xc6), w(0xc7),\
00849 w(0xc8), w(0xc9), w(0xca), w(0xcb), w(0xcc), w(0xcd), w(0xce), w(0xcf),\
00850 w(0xd0), w(0xd1), w(0xd2), w(0xd3), w(0xd4), w(0xd5), w(0xd6), w(0xd7),\
00851 w(0xd8), w(0xd9), w(0xda), w(0xdb), w(0xdc), w(0xdd), w(0xde), w(0xdf),\
00852 w(0xe0), w(0xe1), w(0xe2), w(0xe3), w(0xe4), w(0xe5), w(0xe6), w(0xe7),\
00853 w(0xe8), w(0xe9), w(0xea), w(0xeb), w(0xec), w(0xed), w(0xee), w(0xef),\
00854 w(0xf0), w(0xf1), w(0xf2), w(0xf3), w(0xf4), w(0xf5), w(0xf6), w(0xf7),\
00855 w(0xf8), w(0xf9), w(0xfa), w(0xfb), w(0xfc), w(0xfd), w(0xfe), w(0xff)
00856
00857 #define h0(x) (x)
00858
00859
00860
00861
00862
00863 #define w0(p) bytes2word(p, 0, 0, 0)
00864 #define w1(p) bytes2word(0, p, 0, 0)
00865 #define w2(p) bytes2word(0, 0, p, 0)
00866 #define w3(p) bytes2word(0, 0, 0, p)
00867
00868 #define u0(p) bytes2word(f2(p), p, p, f3(p))
00869 #define u1(p) bytes2word(f3(p), f2(p), p, p)
00870 #define u2(p) bytes2word(p, f3(p), f2(p), p)
00871 #define u3(p) bytes2word(p, p, f3(p), f2(p))
00872
00873 #define v0(p) bytes2word(fe(p), f9(p), fd(p), fb(p))
00874 #define v1(p) bytes2word(fb(p), fe(p), f9(p), fd(p))
00875 #define v2(p) bytes2word(fd(p), fb(p), fe(p), f9(p))
00876 #define v3(p) bytes2word(f9(p), fd(p), fb(p), fe(p))
00877
00878 const aes_32t t_dec(r,c)[RC_LENGTH] =
00879 {
00880 w0(0x01), w0(0x02), w0(0x04), w0(0x08), w0(0x10),
00881 w0(0x20), w0(0x40), w0(0x80), w0(0x1b), w0(0x36)
00882 };
00883
00884 #define d_1(t,n,b,v) const t n[256] = { b(v##0) }
00885 #define d_4(t,n,b,v) const t n[4][256] = { { b(v##0) }, { b(v##1) }, { b(v##2) }, { b(v##3) } }
00886
00887 #else
00888
00889 aes_32t t_dec(r,c)[RC_LENGTH];
00890
00891 #define d_1(t,n,b,v) t n[256]
00892 #define d_4(t,n,b,v) t n[4][256]
00893
00894 #endif
00895
00896 #else
00897
00898 #if defined(FIXED_TABLES)
00899
00900 extern const aes_32t t_dec(r,c)[RC_LENGTH];
00901
00902 #if defined(_MSC_VER) && defined(TABLE_ALIGN)
00903 #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[256]
00904 #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) const t n[4][256]
00905 #else
00906 #define d_1(t,n,b,v) extern const t n[256]
00907 #define d_4(t,n,b,v) extern const t n[4][256]
00908 #endif
00909 #else
00910
00911 extern aes_32t t_dec(r,c)[RC_LENGTH];
00912
00913 #if defined(_MSC_VER) && defined(TABLE_ALIGN)
00914 #define d_1(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[256]
00915 #define d_4(t,n,b,v) extern __declspec(align(TABLE_ALIGN)) t n[4][256]
00916 #else
00917 #define d_1(t,n,b,v) extern t n[256]
00918 #define d_4(t,n,b,v) extern t n[4][256]
00919 #endif
00920 #endif
00921
00922 #endif
00923
00924 #ifdef SBX_SET
00925 d_1(aes_08t, t_dec(s,box), sb_data, h);
00926 #endif
00927 #ifdef ISB_SET
00928 d_1(aes_08t, t_dec(i,box), isb_data, h);
00929 #endif
00930
00931 #ifdef FT1_SET
00932 d_1(aes_32t, t_dec(f,n), sb_data, u);
00933 #endif
00934 #ifdef FT4_SET
00935 d_4(aes_32t, t_dec(f,n), sb_data, u);
00936 #endif
00937
00938 #ifdef FL1_SET
00939 d_1(aes_32t, t_dec(f,l), sb_data, w);
00940 #endif
00941 #ifdef FL4_SET
00942 d_4(aes_32t, t_dec(f,l), sb_data, w);
00943 #endif
00944
00945 #ifdef IT1_SET
00946 d_1(aes_32t, t_dec(i,n), isb_data, v);
00947 #endif
00948 #ifdef IT4_SET
00949 d_4(aes_32t, t_dec(i,n), isb_data, v);
00950 #endif
00951
00952 #ifdef IL1_SET
00953 d_1(aes_32t, t_dec(i,l), isb_data, w);
00954 #endif
00955 #ifdef IL4_SET
00956 d_4(aes_32t, t_dec(i,l), isb_data, w);
00957 #endif
00958
00959 #ifdef LS1_SET
00960 #ifdef FL1_SET
00961 #undef LS1_SET
00962 #else
00963 d_1(aes_32t, t_dec(l,s), sb_data, w);
00964 #endif
00965 #endif
00966
00967 #ifdef LS4_SET
00968 #ifdef FL4_SET
00969 #undef LS4_SET
00970 #else
00971 d_4(aes_32t, t_dec(l,s), sb_data, w);
00972 #endif
00973 #endif
00974
00975 #ifdef IM1_SET
00976 d_1(aes_32t, t_dec(i,m), mm_data, v);
00977 #endif
00978 #ifdef IM4_SET
00979 d_4(aes_32t, t_dec(i,m), mm_data, v);
00980 #endif
00981
00982
00983
00984 #define no_table(x,box,vf,rf,c) bytes2word( \
00985 box[bval(vf(x,0,c),rf(0,c))], \
00986 box[bval(vf(x,1,c),rf(1,c))], \
00987 box[bval(vf(x,2,c),rf(2,c))], \
00988 box[bval(vf(x,3,c),rf(3,c))])
00989
00990 #define one_table(x,op,tab,vf,rf,c) \
00991 ( tab[bval(vf(x,0,c),rf(0,c))] \
00992 ^ op(tab[bval(vf(x,1,c),rf(1,c))],1) \
00993 ^ op(tab[bval(vf(x,2,c),rf(2,c))],2) \
00994 ^ op(tab[bval(vf(x,3,c),rf(3,c))],3))
00995
00996 #define four_tables(x,tab,vf,rf,c) \
00997 ( tab[0][bval(vf(x,0,c),rf(0,c))] \
00998 ^ tab[1][bval(vf(x,1,c),rf(1,c))] \
00999 ^ tab[2][bval(vf(x,2,c),rf(2,c))] \
01000 ^ tab[3][bval(vf(x,3,c),rf(3,c))])
01001
01002 #define vf1(x,r,c) (x)
01003 #define rf1(r,c) (r)
01004 #define rf2(r,c) ((8+r-c)&3)
01005
01006
01007
01008
01009 #if defined(FM4_SET)
01010 #define fwd_mcol(x) four_tables(x,t_use(f,m),vf1,rf1,0)
01011 #elif defined(FM1_SET)
01012 #define fwd_mcol(x) one_table(x,upr,t_use(f,m),vf1,rf1,0)
01013 #else
01014 #define dec_fmvars aes_32t g2
01015 #define fwd_mcol(x) (g2 = gf_mulx(x), g2 ^ upr((x) ^ g2, 3) ^ upr((x), 2) ^ upr((x), 1))
01016 #endif
01017
01018 #if defined(IM4_SET)
01019 #define inv_mcol(x) four_tables(x,t_use(i,m),vf1,rf1,0)
01020 #elif defined(IM1_SET)
01021 #define inv_mcol(x) one_table(x,upr,t_use(i,m),vf1,rf1,0)
01022 #else
01023 #define dec_imvars aes_32t g2, g4, g9
01024 #define inv_mcol(x) (g2 = gf_mulx(x), g4 = gf_mulx(g2), g9 = (x) ^ gf_mulx(g4), g4 ^= g9, \
01025 (x) ^ g2 ^ g4 ^ upr(g2 ^ g9, 3) ^ upr(g4, 2) ^ upr(g9, 1))
01026 #endif
01027
01028 #if defined(FL4_SET)
01029 #define ls_box(x,c) four_tables(x,t_use(f,l),vf1,rf2,c)
01030 #elif defined(LS4_SET)
01031 #define ls_box(x,c) four_tables(x,t_use(l,s),vf1,rf2,c)
01032 #elif defined(FL1_SET)
01033 #define ls_box(x,c) one_table(x,upr,t_use(f,l),vf1,rf2,c)
01034 #elif defined(LS1_SET)
01035 #define ls_box(x,c) one_table(x,upr,t_use(l,s),vf1,rf2,c)
01036 #else
01037 #define ls_box(x,c) no_table(x,t_use(s,box),vf1,rf2,c)
01038 #endif
01039
01040 #if defined(__cplusplus)
01041 }
01042 #endif
01043
01044 #endif